package com.helin.helinhealth.utils;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

/**
 * Spring上下文工具类
 * 
 * <p>
 * 该工具类用于在非Spring管理的类中获取Spring容器中的Bean，
 * 实现了ApplicationContextAware接口，在Spring容器启动时自动注入ApplicationContext。
 * </p>
 * 
 * <p>
 * 主要用于在静态工具类（如UserContext）中获取Spring容器中的服务，
 * 避免静态方法无法直接使用@Autowired注解的问题。
 * </p>
 */
@Component
public class SpringContextUtils implements ApplicationContextAware {

    /**
     * Spring应用上下文
     */
    private static ApplicationContext applicationContext;

    /**
     * 实现ApplicationContextAware接口的setApplicationContext方法，
     * 在Spring容器启动时自动调用，注入ApplicationContext
     * 
     * @param applicationContext Spring应用上下文
     * @throws BeansException Bean异常
     */
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringContextUtils.applicationContext = applicationContext;
    }

    /**
     * 获取Spring应用上下文
     * 
     * @return Spring应用上下文
     */
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    /**
     * 根据Bean名称获取Bean
     * 
     * @param name Bean名称
     * @return Bean实例
     */
    public static Object getBean(String name) {
        return applicationContext.getBean(name);
    }

    /**
     * 根据Bean类型获取Bean
     * 
     * @param clazz Bean类型
     * @return Bean实例
     */
    public static <T> T getBean(Class<T> clazz) {
        return applicationContext.getBean(clazz);
    }

    /**
     * 根据Bean名称和类型获取Bean
     * 
     * @param name Bean名称
     * @param clazz Bean类型
     * @return Bean实例
     */
    public static <T> T getBean(String name, Class<T> clazz) {
        return applicationContext.getBean(name, clazz);
    }
    
    /**
     * 获取Spring环境变量对象
     * 
     * @return 环境变量对象
     */
    public static Environment getEnvironment() {
        return applicationContext.getEnvironment();
    }
} 